//
//  ZSUDPServer.h
//  ZhuShou
//
//  Created by Dejun Liu on 15/11/9.
//  Copyright © 2015年 jw. All rights reserved.
//

#import <Foundation/Foundation.h>
#import <CocoaAsyncSocket/GCDAsyncUdpSocket.h>
#import "BRMessage.h"
#import "ByteBufferReader.h"
#import "ByteBufferWriter.h"

/**
 回调事件类型
 */
typedef enum : NSUInteger {
    UDPServerEventTypeDidConnectToAddress,  //连接上某个server
    UDPServerEventTypeDidNotConnect,        //没有连接上
    UDPServerEventTypeDidSendData,          //已经发送了数据
    UDPServerEventTypeDidNotSendData,       //没有发送数据
    UDPServerEventTypeDidReceiveData,       //已经收到数据
    UDPServerEventTypeDidClose,             //关闭socket
} UDPServerEventType;

/**
 *  回调事件
 *
 *  @param event         事件类型
 *  @param sock          sock对象
 *  @param toAddress     到服务器的地址
 *  @param fromAddress   来自某个服务器的地址
 *  @param receiveData   收到的数据
 *  @param error         发生的报错
 *  @param tag           sock对象sock
 *  @param filterContext 过滤对象
 */
typedef void(^ZSUDPServerCallBack)(UDPServerEventType event,
                                   GCDAsyncUdpSocket *sock,
                                   NSData *toAddress,
                                   NSData *fromAddress,
                                   NSData *receiveData,
                                   NSError *error,
                                   long tag,
                                   id filterContext);

@interface ZSUDPServer : NSObject <GCDAsyncUdpSocketDelegate>

/**
 *  UDPServer
 */
@property (nonatomic,strong,readonly) GCDAsyncUdpSocket *server;

/**
 *  是否正在运行
 */
@property (nonatomic,assign,readonly) BOOL isRunning;

@property (nonatomic,copy) ZSUDPServerCallBack eventCallBack;

/**
 *  开始监听某个端口
 *
 *  @param shouldStart YES开始 NO停止
 *  @param port        端口号
 */
- (void)startUDPServer:(BOOL) shouldStart port:(NSInteger) port;

/**
 *  停止UDP server
 */
- (void)stopServer;

/**
 *  发送一个UTF8的string到服务器
 *
 *  @param string  utf8字符串
 *  @param ip      ip地址
 *  @param port    端口
 *  @param timeout 超时时间
 *  @param tag     tag
 */
- (void)sendString:(NSString *)string
            hostIP:(NSString *) ip
              port:(UInt16) port
           timeout:(NSTimeInterval) timeout
               tag:(long) tag;
/**
 *  发送一个二进制到服务器
 *
 *  @param data    二进制数据
 *  @param ip      ip地址
 *  @param port    端口
 *  @param timeout 超时时间
 *  @param tag     tag
 */
- (void)sendData:(NSData *)data
          hostIP:(NSString *) ip
            port:(UInt16) port
         timeout:(NSTimeInterval) timeout
             tag:(long) tag;

@end
